from django.db import models

# Create your models here.
# 一个mysql软件中，可以有多个数据库
# 一个数据库中，可以有多张数据表(table)
# 一个数据表中，有多条数据以及多个字段


# 1.可以在子应用projects/models.py文件中，来定义数据模型类
# 2.一个数据模型类对应一个数据表
# 3.数据模型类，需要继承Model父类或者Model之类
# 4.在数据模型中，添加的类属性(Field)对象来对应数据表中的字段
# 5.创建完数据库模型类之后，需要迁移才能生成数据表
#   a.生成迁移脚本 python manage.py makemigrations projects 指定项目名，生成的迁移脚本放在projects/migration目录中
#   b.执行迁移脚本 python manage.py migrate 不指定项目名,会把所有的子应用迁移脚本都执行，指定了项目名，就只生成那个项目下的迁移脚本
#   c.python manage.py sqlmigrate projects 0001_initial 可以查看迁移脚本对应执行的SQL语句
#   d.执行迁移脚本之后，生成的数据表名默认为 子应用名_模型类名小写
# 6.会自动创建字段名为id的类属性，自增、主键、非空
class Projects(models.Model):  # 基本上用子应用名首字母大写的方式命名
    # 7.只要某一个字段中primary_key=True，那么Django就不会自动创建id字段，会使用自定义的
    # 8.CharField -> var
    #   IntegerField-> int
    #   TextField -> text 长文本，不限制字符数量
    idx = models.AutoField(primary_key=True)

    # 9.verbose_name 为个性化信息
    # 10.help_text 帮助文本信息，在api接口文档平台和admin后端站点中会用于提示，往往跟verbose_name一直使用
    # 11.unique用于指定唯一键，默认为False
    # 12.CharField至少要指定一个max_length必传参数，代表此字段的最大长度，不能为负数
    name = models.CharField(max_length=200,verbose_name='项目说明',help_text='项目说明',unique=True)
    leader = models.CharField(max_length=50,verbose_name='项目负责人',help_text='项目负责人')
    tester = models.CharField(max_length=50, verbose_name='测试人员', help_text='测试人员')
    programmer = models.CharField(max_length=50, verbose_name='开发人员', help_text='开发人员')

    # 13.null指定数据在保存时是否可以为空，默认不能为空，如果为True，那么可以为空值
    # 14.blank指定前端用户在创建数据时，是否需要传递，默认需要传递，如果不传递，需要将blank设置为True
    # 15.default为某一个字段，指定默认值，往往会跟blank一起使用
    desc = models.TextField(verbose_name='项目简介', help_text='项目简介',null=True,blank=True,default='xxx简介')

    # 16.DateTimeField可以添加auto_now_add选项，Django会自动添加创建记录的时间
    create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间',help_text='创建时间')

    # 17.DateTimeField可以添加auto_now选项，Django会自动添加更新记录时的时间
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', help_text='更新时间')

    # 18.执行迁移脚本之后，生成的数据表名默认为子应用名_模型类名小写
    # 可以在模型类下定义Meta子类，Meta子类名称固定
    class Meta:
        # a.可以使用db_table类属性，来指定表名
        db_table = 'tb_projects'
        # b. 指定表的个性化描述
        verbose_name = '项目表'

    #打印一个对象，调用的是__str__魔术方法
    #指定(打印对象时输出的)结果
    def __str__(self):
        return f'<{self.name}>'
